/**
 * Create in 2012-9-10 下午9:07:06.
 */
package kit4j.common.io.file;

import java.io.File;
import java.io.FileFilter;
import java.io.FilenameFilter;

/**
 * FileFilter 的一个实现，它使用指定的扩展名集合进行过滤。<br />
 * 文件的扩展名是指文件名最后一个“.”后面的部分。名称不包含“.”的文件没有文件扩展名。文件扩展名的比较不区分大小写。
 * 
 * @see javax.swing.filechooser.FileNameExtensionFilter
 * @author MiniKnife
 * 
 */
public class FileNameExtentionFilter implements FileFilter, FilenameFilter {

	private String[] extensions;

	/**
	 * 使用指定的文件扩展名创建一个 FileNameExtensionFilter。
	 * 
	 * @param extensions
	 *            文件扩展名
	 */
	public FileNameExtentionFilter(String... extensions) {
		if (extensions == null || extensions.length == 0) {
			throw new IllegalArgumentException("Extensions must be non-null and not empty");
		}

		this.extensions = new String[extensions.length];

		for (int i = 0; i < extensions.length; ++i) {
			if (extensions[i] == null || extensions[i].length() == 0) {
				throw new IllegalArgumentException("Each extension must be non-null and not empty");
			}

			this.extensions[i] = extensions[i];
		}
	}

	/**
	 * @see java.io.FilenameFilter#accept(java.io.File, java.lang.String)
	 */
	@Override
	public boolean accept(File dir, String name) {
		int index = name.lastIndexOf('.');

		if (index != -1 && index < name.length() - 1) {
			String fe = name.substring(index + 1);

			for (String ex : extensions) {
				if (ex.equalsIgnoreCase(fe)) {
					return true;
				}
			}
		}

		return false;
	}

	/**
	 * @see java.io.FileFilter#accept(java.io.File)
	 */
	@Override
	public boolean accept(File file) {
		return accept(file.getParentFile(), file.getName());
	}

	/**
	 * 返回要测试文件的文件扩展名集合。
	 * 
	 * @return 要测试文件的文件扩展名集合。
	 */
	public String[] getExtensions() {
		String[] result = new String[extensions.length];
		System.arraycopy(extensions, 0, result, 0, extensions.length);

		return result;
	}

}
